๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์น ์ปดํฌ๋ํธ ๋ฐฐํฌ ๋ฐ ํจํค์ง๊ณผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปค์คํ ์๋ฆฌ๋จผํธ ์ ์์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก ์ข ํฉ ๊ฐ์ด๋.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ปค์คํ ์๋ฆฌ๋จผํธ ๋ฐฐํฌ ๋ฐ ํจํค์ง
์น ์ปดํฌ๋ํธ๋ ์ฌ์ฉ ์ค์ธ ํ๋ ์์ํฌ์ ๊ด๊ณ์์ด ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ์ฌ๋ฌ ํ๋ก์ ํธ์ ํ์์ ๊ณต์ ํ ์ ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ด์์ ์ธ ์๋ฃจ์ ์ ๋๋ค. ํ์ง๋ง ์น ์ปดํฌ๋ํธ๋ฅผ ์๋น์ฉ์ผ๋ก ๋ฐฐํฌํ๊ณ ํจํค์งํ๋ ๊ฒ์ ๋ณต์กํ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ ๋ค์ํ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฌ์ฉ์ฑ ๋ฐ ํตํฉ ์ฉ์ด์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํ ์ปค์คํ ์๋ฆฌ๋จผํธ ๋ฐฐํฌ ๋ฐ ํจํค์ง ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
์น ์ปดํฌ๋ํธ ์ดํดํ๊ธฐ
๋ฐฐํฌ ๋ฐ ํจํค์ง์ ๋ํด ์์๋ณด๊ธฐ ์ ์ ์น ์ปดํฌ๋ํธ๊ฐ ๋ฌด์์ธ์ง ๊ฐ๋จํ ์์ฝํด ๋ณด๊ฒ ์ต๋๋ค:
- ์ปค์คํ ์๋ฆฌ๋จผํธ(Custom Elements): ์ฌ์ฉ์ ์ ์ ๋์์ ๊ฐ์ง ์์ ๋ง์ HTML ์๋ฆฌ๋จผํธ๋ฅผ ์ ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
- ์๋ DOM(Shadow DOM): ์ปดํฌ๋ํธ์ ๋งํฌ์ , ์คํ์ผ, ๋์์ ๋ํ ์บก์ํ๋ฅผ ์ ๊ณตํ์ฌ ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ์ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
- HTML ํ ํ๋ฆฟ(HTML Templates): ๋ณต์ ํ์ฌ DOM์ ์ฝ์ ํ ์ ์๋ ๋งํฌ์ ์กฐ๊ฐ์ ์ ์ธํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
์น ์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ํ๋ ์น ๊ฐ๋ฐ์ ์์ด ๊ท์คํ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํํ๊ธฐ
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์๋ ์์ง๋ง, ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๊ณ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ธ๊ธฐ ์๋ ์ต์ ์ ๋๋ค:
- Lit-Element: ๊ตฌ๊ธ์์ ๋ง๋ ๊ฐ๋จํ๊ณ ๊ฐ๋ฒผ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ฐ์ํ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ, ํจ์จ์ ์ธ ๋ ๋๋ง, ์ฌ์ฉํ๊ธฐ ์ฌ์ด API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ค์ ๊ท๋ชจ์ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
- Stencil: ์น ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ์ปดํ์ผ๋ฌ์ ๋๋ค. Stencil์ ์ฑ๋ฅ์ ์ค์ ์ ๋๋ฉฐ ์ฌ์ ๋ ๋๋ง ๋ฐ ์ง์ฐ ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ณต์กํ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ข์ ์ ํ์ ๋๋ค.
- Svelte: ์๋ฐํ ๋งํด ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋์ง๋ง, Svelte๋ ์ปดํฌ๋ํธ๋ฅผ ๊ณ ๋๋ก ์ต์ ํ๋ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ปดํ์ผํ๋ฉฐ, ์ด๋ฅผ ์น ์ปดํฌ๋ํธ๋ก ํจํค์งํ ์ ์์ต๋๋ค. Svelte์ ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๋ํ ์ง์ค์ ๋งค๋ ฅ์ ์ธ ์ต์ ์ ๋๋ค.
- Vue.js์ React: ์ด ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ๋ค๋
vue-custom-element๋react-to-webcomponent๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ฃผ๋ ์ด์ ์ ์๋์ง๋ง, ๊ธฐ์กด ์ปดํฌ๋ํธ๋ฅผ ์น ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ํ๋ก์ ํธ์ ํตํฉํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ฌํญ, ํ์ ์ ๋ฌธ์ฑ, ์ฑ๋ฅ ๋ชฉํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๋ฐฐํฌ ๋ฐฉ๋ฒ
์น ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ํ์๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐฐํฌํด์ผ ํฉ๋๋ค. ๋ค์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฐํฌ ๋ฐฉ๋ฒ์ ๋๋ค:
1. npm ํจํค์ง
์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ npm(Node Package Manager)์ ํตํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ npm์ด๋ yarn๊ณผ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์ค์นํ ์ ์์ต๋๋ค.
npm์ ๊ฒ์ํ๋ ๋จ๊ณ:
- npm ๊ณ์ ์์ฑ: ์์ง ์๋ค๋ฉด npmjs.com์์ ๊ณ์ ์ ๋ง๋์ธ์.
- ํ๋ก์ ํธ ์ด๊ธฐํ: ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์
package.jsonํ์ผ์ ๋ง๋์ธ์. ์ด ํ์ผ์๋ ํจํค์ง ์ด๋ฆ, ๋ฒ์ , ์์กด์ฑ๊ณผ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.npm init์ ์ฌ์ฉํ์ฌ ์ด ๊ณผ์ ์ ์งํํ ์ ์์ต๋๋ค. package.json๊ตฌ์ฑ:package.jsonํ์ผ์ ๋ค์์ ์ค์ํ ํ๋๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค:name: ํจํค์ง ์ด๋ฆ (npm์์ ๊ณ ์ ํด์ผ ํจ).version: ํจํค์ง ๋ฒ์ ๋ฒํธ (์๋งจํฑ ๋ฒ์ ๋์ ๋ฐ๋ฆ).description: ํจํค์ง์ ๋ํ ๊ฐ๋ตํ ์ค๋ช .main: ํจํค์ง์ ์ง์ ์ (์ผ๋ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ณด๋ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ).module: ์ฝ๋์ ES ๋ชจ๋ ๋ฒ์ ์ ๋ํ ๊ฒฝ๋ก (์ต์ ๋ฒ๋ค๋ฌ์ ์ค์).files: ๊ฒ์๋ ํจํค์ง์ ํฌํจ๋์ด์ผ ํ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ ๋ฐฐ์ด.keywords: ์ฌ์ฉ์๊ฐ npm์์ ํจํค์ง๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ด ๋ ํค์๋.author: ๋น์ ์ ์ด๋ฆ ๋๋ ์กฐ์ง.license: ํจํค์ง๊ฐ ๋ฐฐํฌ๋๋ ๋ผ์ด์ ์ค (์: MIT, Apache 2.0).dependencies: ์ปดํฌ๋ํธ๊ฐ ์์กดํ๋ ๋ชจ๋ ์ข ์์ฑ์ ๋์ดํฉ๋๋ค. ํด๋น ์ข ์์ฑ๋ ES ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ๋๋ ๊ฒฝ์ฐ, ์๋งจํฑ ๋ฒ์ ๋(์: "^1.2.3" ๋๋ "~2.0.0")์ ์ฌ์ฉํ์ฌ ์ ํํ ๋ฒ์ ๋๋ ๋ฒ์ ๋ฒ์๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.peerDependencies: ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๊ณต๋ ๊ฒ์ผ๋ก ์์๋๋ ์ข ์์ฑ. ์ค๋ณต๋ ์ข ์์ฑ์ ๋ฒ๋ค๋งํ์ง ์๊ธฐ ์ํด ์ค์ํฉ๋๋ค.
- ์ปดํฌ๋ํธ ๋น๋: Rollup, Webpack ๋๋ Parcel๊ณผ ๊ฐ์ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ๋ฅผ ๋จ์ผ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ(๋๋ ๋ ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ์ฌ๋ฌ ํ์ผ)๋ก ๋ฒ๋ค๋งํ์ธ์. Stencil๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋จ๊ณ๋ ์ผ๋ฐ์ ์ผ๋ก ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ ๋์ ํธํ์ฑ์ ์ํด ES ๋ชจ๋(ESM)๊ณผ CommonJS(CJS) ๋ฒ์ ์ ๋ชจ๋ ๋ง๋๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- npm ๋ก๊ทธ์ธ: ํฐ๋ฏธ๋์์
npm login์ ์คํํ๊ณ npm ์๊ฒฉ ์ฆ๋ช ์ ์ ๋ ฅํ์ธ์. - ํจํค์ง ๊ฒ์:
npm publish๋ฅผ ์คํํ์ฌ ํจํค์ง๋ฅผ npm์ ๊ฒ์ํ์ธ์.
package.json ์์:
{
"name": "my-web-component-library",
"version": "1.0.0",
"description": "A collection of reusable web components.",
"main": "dist/my-web-component-library.cjs.js",
"module": "dist/my-web-component-library.esm.js",
"files": [
"dist",
"src"
],
"keywords": [
"web components",
"custom elements",
"ui library"
],
"author": "Your Name",
"license": "MIT",
"dependencies": {
"lit": "^2.0.0"
},
"devDependencies": {
"rollup": "^2.0.0"
},
"scripts": {
"build": "rollup -c"
}
}
npm ํจํค์ง์ ๋ํ ๊ตญ์ ํ ๊ณ ๋ ค์ฌํญ: ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ๋ ์น ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๋ npm ํจํค์ง๋ฅผ ๋ฐฐํฌํ ๋๋ ๋ค์์ ๊ณ ๋ คํ์ธ์:
- ์ง์ญํ ๊ฐ๋ฅํ ๋ฌธ์์ด: ์ปดํฌ๋ํธ ๋ด์ ํ
์คํธ๋ฅผ ํ๋์ฝ๋ฉํ์ง ๋ง์ธ์. ๋์ ๊ตญ์ ํ(i18n) ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ธ์.
i18next์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ข ์์ฑ์ผ๋ก ๋ฒ๋ค๋ง๋ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ์ฌ์ฉ์๊ฐ ์ง์ญ๋ณ ๋ฌธ์์ด์ ์ฃผ์ ํ ์ ์๋๋ก ๊ตฌ์ฑ ์ต์ ์ ๋ ธ์ถํ์ธ์. - ๋ ์ง ๋ฐ ์ซ์ ์์ ์ง์ : ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๋ ์ง, ์ซ์, ํตํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ์ง์ ํ๋์ง ํ์ธํ์ธ์. ๋ก์ผ์ผ์ ๋ง๋ ์์ ์ง์ ์ ์ํด
IntlAPI๋ฅผ ์ฌ์ฉํ์ธ์. - ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก(RTL) ์ง์: ์ปดํฌ๋ํธ๊ฐ ํ ์คํธ๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ ์๋์ด ๋ฐ ํ๋ธ๋ฆฌ์ด์ ๊ฐ์ RTL ์ธ์ด๋ฅผ ์ง์ํ๋์ง ํ์ธํ์ธ์. CSS ๋ ผ๋ฆฌ์ ์์ฑ์ ์ฌ์ฉํ๊ณ ์ปดํฌ๋ํธ์ ๋ฐฉํฅ์ฑ์ ์ ํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
2. ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)
CDN์ ์น ์ปดํฌ๋ํธ๋ฅผ ์ ์ธ๊ณ์ ๋ถ์ฐ๋ ์๋ฒ์ ํธ์คํ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์๊ฐ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ํ๋กํ ํ์ดํ์ด๋ ํจํค์ง ์ค์น ์์ด ๋ ๋์ ์ฌ์ฉ์์๊ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ ๋ ์ ์ฉํฉ๋๋ค.
์ฃผ์ CDN ์ต์ :
- jsDelivr: npm ํจํค์ง๋ฅผ ์๋์ผ๋ก ํธ์คํ ํ๋ ๋ฌด๋ฃ ์คํ์์ค CDN์ ๋๋ค.
- unpkg: npm์์ ์ง์ ํ์ผ์ ์ ๊ณตํ๋ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ CDN์ ๋๋ค.
- Cloudflare: ์บ์ฑ ๋ฐ ๋ณด์๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฌด๋ฃ ํ๋์ด ์๋ ์์ฉ CDN์ ๋๋ค.
CDN ์ฌ์ฉํ๊ธฐ:
- npm์ ๊ฒ์: ๋จผ์ , ์์์ ์ค๋ช ํ ๋๋ก ์น ์ปดํฌ๋ํธ๋ฅผ npm์ ๊ฒ์ํฉ๋๋ค.
- CDN URL ์ฐธ์กฐ: CDN์ URL์ ์ฌ์ฉํ์ฌ HTML ํ์ด์ง์ ์น ์ปดํฌ๋ํธ๋ฅผ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด, jsDelivr๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
<script src="https://cdn.jsdelivr.net/npm/my-web-component-library@1.0.0/dist/my-web-component-library.esm.js" type="module"></script>
CDN ๋ฐฐํฌ ์ ๊ณ ๋ ค์ฌํญ:
- ๋ฒ์ ๋: ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ฒ์ ์ด ์ถ์๋ ๋ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ํญ์ CDN URL์ ๋ฒ์ ๋ฒํธ๋ฅผ ๋ช ์ํ์ธ์.
- ์บ์ฑ: CDN์ ํ์ผ์ ๊ณต๊ฒฉ์ ์ผ๋ก ์บ์ํ๋ฏ๋ก, ์บ์ฑ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ณ ์ ๋ฒ์ ์ ์ปดํฌ๋ํธ๋ฅผ ์ถ์ํ ๋ ์บ์๋ฅผ ๋ฌดํจํํ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ณด์: ๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ๊ณต๊ฒฉ๊ณผ ๊ฐ์ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด CDN์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ธ์.
3. ์์ฒด ํธ์คํ
์์ ์ ์๋ฒ์์ ์ง์ ์น ์ปดํฌ๋ํธ๋ฅผ ํธ์คํ ํ ์๋ ์์ต๋๋ค. ์ด๋ ๋ฐฐํฌ ๊ณผ์ ์ ๋ํ ๋ ๋ง์ ์ ์ด๊ถ์ ์ฃผ์ง๋ง, ์ค์ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค.
์์ฒด ํธ์คํ ๋จ๊ณ:
- ์ปดํฌ๋ํธ ๋น๋: npm ํจํค์ง์ ๋ง์ฐฌ๊ฐ์ง๋ก ์น ์ปดะฟะพ๋ํธ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋น๋ํด์ผ ํฉ๋๋ค.
- ์๋ฒ์ ์ ๋ก๋: ์น ์๋ฒ์ ๋๋ ํฐ๋ฆฌ๋ก ํ์ผ์ ์ ๋ก๋ํฉ๋๋ค.
- URL ์ฐธ์กฐ: ์๋ฒ์ ์๋ ํ์ผ์ URL์ ์ฌ์ฉํ์ฌ HTML ํ์ด์ง์ ์น ์ปดํฌ๋ํธ๋ฅผ ํฌํจํฉ๋๋ค:
<script src="/components/my-web-component-library.esm.js" type="module"></script>
์์ฒด ํธ์คํ ์ ๊ณ ๋ ค์ฌํญ:
- ํ์ฅ์ฑ: ์๋ฒ๊ฐ ์น ์ปดํฌ๋ํธ์ ์ ๊ทผํ๋ ์ฌ์ฉ์๋ก ์ธํด ๋ฐ์ํ๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ธํ์ธ์.
- ๋ณด์: ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์๋ฒ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์ ์ ํ ๋ณด์ ์กฐ์น๋ฅผ ๊ตฌํํ์ธ์.
- ์ ์ง๋ณด์: ์๋ฒ๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ณ ์น ์ปดํฌ๋ํธ๊ฐ ํญ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํ ์ฑ ์์ ์์ ์๊ฒ ์์ต๋๋ค.
ํจํค์ง ์ ๋ต
์น ์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ํจํค์งํ๋๋์ ๋ฐ๋ผ ์ฌ์ฉ์ฑ๊ณผ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ค์์ ๊ณ ๋ คํด ๋ณผ ๋งํ ๋ช ๊ฐ์ง ํจํค์ง ์ ๋ต์ ๋๋ค:
1. ๋จ์ผ ํ์ผ ๋ฒ๋ค
๋ชจ๋ ์น ์ปดํฌ๋ํธ๋ฅผ ๋จ์ผ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ฒ๋ค๋งํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํ๋ ๋ฐ ํ์ํ HTTP ์์ฒญ ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํ์ง๋ง ํ์ผ ํฌ๊ธฐ๊ฐ ์ปค์ ธ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ด ์ฆ๊ฐํ ์๋ ์์ต๋๋ค.
๋ฒ๋ค๋ง ๋๊ตฌ:
- Rollup: ์๊ณ ํจ์จ์ ์ธ ๋ฒ๋ค์ ๋ง๋๋ ๋ฐ ๋ฐ์ด๋ ์ธ๊ธฐ ์๋ ๋ฒ๋ค๋ฌ์ ๋๋ค.
- Webpack: ๋ณต์กํ ํ๋ก์ ํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ด ๋ ํ๋ถํ ๋ฒ๋ค๋ฌ์ ๋๋ค.
- Parcel: ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ ๋ก ๊ตฌ์ฑ ๋ฒ๋ค๋ฌ์ ๋๋ค.
Rollup ๊ตฌ์ฑ ์์:
// rollup.config.js
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
export default {
input: 'src/index.js',
output: {
file: 'dist/my-web-component-library.esm.js',
format: 'es'
},
plugins: [
resolve(),
commonjs()
]
};
2. ๋ค์ค ํ์ผ ๋ฒ๋ค (์ฝ๋ ๋ถํ )
์ฝ๋ ๋ถํ ์ ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ํ์ผ๋ก ๋๋์ด ์ฌ์ฉ์๊ฐ ํ์ํ ์ฝ๋๋ง ๋ค์ด๋ก๋ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ํนํ ๋๊ท๋ชจ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ฝ๋ ๋ถํ ๊ธฐ๋ฒ:
- ๋์ ์ํฌํธ(Dynamic Imports): ๋์ ์ํฌํธ(
import())๋ฅผ ์ฌ์ฉํ์ฌ ํ์์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํฉ๋๋ค. - ๋ผ์ฐํธ ๊ธฐ๋ฐ ๋ถํ : ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ผ์ฐํธ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ๋ถํ ํฉ๋๋ค.
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋ถํ : ์ปดํฌ๋ํธ๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฒญํฌ๋ก ๋ถํ ํฉ๋๋ค.
์ฝ๋ ๋ถํ ์ ์ด์ :
- ์ด๊ธฐ ๋ก๋ ์๊ฐ ๋จ์ถ: ์ฌ์ฉ์๋ ์์ํ๋ ๋ฐ ํ์ํ ์ฝ๋๋ง ๋ค์ด๋ก๋ํฉ๋๋ค.
- ์ฑ๋ฅ ํฅ์: ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ ๋์ ์บ์ฑ: ๋ธ๋ผ์ฐ์ ๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ ํ์ผ์ ์บ์ํ ์ ์์ด, ํ์ ๋ฐฉ๋ฌธ ์ ๋ค์ด๋ก๋ํด์ผ ํ ๋ฐ์ดํฐ ์์ ์ค์ผ ์ ์์ต๋๋ค.
3. ์๋ DOM ๋ ๋ผ์ดํธ DOM
์น ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ ์๋ DOM์ ์ฌ์ฉํ ์ง ๋ผ์ดํธ DOM์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ์๋ DOM์ ์บก์ํ๋ฅผ ์ ๊ณตํ์ฌ ์ธ๋ถ ์ธ๊ณ์ ์คํ์ผ๊ณผ ์คํฌ๋ฆฝํธ๊ฐ ์ปดํฌ๋ํธ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ๋ฐ๋ฉด์ ๋ผ์ดํธ DOM์ ์คํ์ผ๊ณผ ์คํฌ๋ฆฝํธ๊ฐ ์ปดํฌ๋ํธ์ ์นจํฌํ๋๋ก ํ์ฉํฉ๋๋ค.
์๋ DOM๊ณผ ๋ผ์ดํธ DOM ์ค ์ ํํ๊ธฐ:
- ์๋ DOM: ์ปดํฌ๋ํธ์ ์คํ์ผ๊ณผ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌ์ํค๊ณ ์ถ์ ๋ ์๋ DOM์ ์ฌ์ฉํ์ธ์. ์ด๊ฒ์ด ๋๋ถ๋ถ์ ์น ์ปดํฌ๋ํธ์ ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
- ๋ผ์ดํธ DOM: ์ปดํฌ๋ํธ๊ฐ ์ธ๋ถ ์ธ๊ณ์ ์ํด ์คํ์ผ๋ง๋๊ณ ์คํฌ๋ฆฝํ ๋๊ธฐ๋ฅผ ์ํ ๋ ๋ผ์ดํธ DOM์ ์ฌ์ฉํ์ธ์. ์ด๋ ๊ณ ๋๋ก ์ฌ์ฉ์ ์ ์๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์๋ DOM ์ฌ์ฉ ์ ๊ณ ๋ ค์ฌํญ:
- ์คํ์ผ๋ง: ์๋ DOM์ ์ฌ์ฉํ๋ ์น ์ปดํฌ๋ํธ์ ์คํ์ผ๋ง์ CSS ์ฌ์ฉ์ ์ ์ ์์ฑ(๋ณ์) ๋๋ CSS ํํธ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์ ๊ทผ์ฑ: ์๋ DOM์ ์ฌ์ฉํ ๋ ์ ์ ํ ARIA ์์ฑ์ ์ ๊ณตํ์ฌ ์น ์ปดํฌ๋ํธ์ ์ ๊ทผ์ฑ์ ๋ณด์ฅํ์ธ์.
๋ฐฐํฌ ๋ฐ ํจํค์ง ๋ชจ๋ฒ ์ฌ๋ก
์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ๊ณ ํจํค์งํ ๋ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋งจํฑ ๋ฒ์ ๋ ์ฌ์ฉ: ์ปดํฌ๋ํธ์ ์ ๋ฒ์ ์ ์ถ์ํ ๋ ์๋งจํฑ ๋ฒ์ ๋(SemVer)์ ๋ฐ๋ฅด์ธ์. ์ด๋ ์ฌ์ฉ์๊ฐ ์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ๋์ ์ํฅ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ช ํํ ๋ฌธ์ ์ ๊ณต: ์ฌ์ฉ ๋ฐฉ๋ฒ์ ํฌํจํ ์์์ ํจ๊ป ์ปดํฌ๋ํธ๋ฅผ ์ฒ ์ ํ ๋ฌธ์ํํ์ธ์. Storybook์ด๋ ๋ฌธ์ ์์ฑ๊ธฐ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํํ ๋ฌธ์๋ฅผ ๋ง๋์ธ์.
- ๋จ์ ํ ์คํธ ์์ฑ: ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ์ด๋ ๋ฒ๊ทธ๋ฅผ ์๋ฐฉํ๊ณ ์ปดํฌ๋ํธ์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ์ปดํฌ๋ํธ๊ฐ ํ์๋ก ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ CSS์ ์์ ์ต์ํํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ์ธ์. ์ฝ๋ ๋ถํ ๋ฐ ์ง์ฐ ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค์ธ์.
- ์ ๊ทผ์ฑ ๊ณ ๋ ค: ์ปดํฌ๋ํธ๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋์ธ์. ARIA ์์ฑ์ ์ฌ์ฉํ๊ณ ์ ๊ทผ์ฑ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ธ์.
- ๋น๋ ์์คํ ์ฌ์ฉ: Rollup์ด๋ Webpack๊ณผ ๊ฐ์ ๋น๋ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋น๋ ๋ฐ ํจํค์ง ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ธ์.
- ESM๊ณผ CJS ๋ชจ๋ ๋ชจ๋ ์ ๊ณต: ES ๋ชจ๋(ESM)๊ณผ CommonJS(CJS) ํ์์ ๋ชจ๋ ์ ๊ณตํ๋ฉด ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์์ ํธํ์ฑ์ด ๋์์ง๋๋ค. ESM์ด ํ๋ ํ์ค์ด์ง๋ง, CJS๋ ์ฌ์ ํ ์ค๋๋ Node.js ํ๋ก์ ํธ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- CSS-in-JS ์๋ฃจ์ ๊ณ ๋ ค: ๋ณต์กํ ์คํ์ผ๋ง ์๊ตฌ์ฌํญ์ ๊ฒฝ์ฐ, Styled Components๋ Emotion๊ณผ ๊ฐ์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํนํ ์๋ DOM ์บก์ํ๋ฅผ ๋ค๋ฃฐ ๋ ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ ์ ์ฐํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ ์ํฅ์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค.
- CSS ์ฌ์ฉ์ ์ ์ ์์ฑ(CSS ๋ณ์) ์ฌ์ฉ: ์น ์ปดํฌ๋ํธ ์ฌ์ฉ์๊ฐ ์คํ์ผ๋ง์ ์ฝ๊ฒ ์ฌ์ฉ์ ์ ์ํ ์ ์๋๋ก CSS ์ฌ์ฉ์ ์ ์ ์์ฑ์ ์ฌ์ฉํ์ธ์. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ์ง์ ์์ ํ์ง ์๊ณ ๋ ๊ธฐ๋ณธ ์คํ์ผ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
์์ ๋ฐ ์ฌ๋ก ์ฐ๊ตฌ
๋ค์ํ ์กฐ์ง๋ค์ด ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๋ฐฐํฌํ๊ณ ํจํค์งํ๋์ง์ ๋ํ ๋ช ๊ฐ์ง ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ๊ตฌ๊ธ์ Material Web Components: ๊ตฌ๊ธ์ Material Web Components๋ฅผ npm ํจํค์ง๋ก ๋ฐฐํฌํฉ๋๋ค. ESM๊ณผ CJS ๋ชจ๋์ ๋ชจ๋ ์ ๊ณตํ๋ฉฐ ์ฝ๋ ๋ถํ ์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
- ์ธ์ผ์ฆํฌ์ค์ Lightning Web Components: ์ธ์ผ์ฆํฌ์ค๋ ์์ฒด ๋น๋ ์์คํ ์ ์ฌ์ฉํ์ฌ Lightning ํ๋ซํผ์ ์ต์ ํ๋ ์น ์ปดํฌ๋ํธ๋ฅผ ์์ฑํฉ๋๋ค. ๋ํ ์ปดํฌ๋ํธ ๋ฐฐํฌ๋ฅผ ์ํด CDN๋ ์ ๊ณตํฉ๋๋ค.
- Vaadin Components: Vaadin์ ํ๋ถํ ์น ์ปดํฌ๋ํธ ์ธํธ๋ฅผ npm ํจํค์ง๋ก ์ ๊ณตํฉ๋๋ค. Stencil์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ ์์ธํ ๋ฌธ์์ ์์๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ๋ ์์ํฌ ํตํฉ
์น ์ปดํฌ๋ํธ๋ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ก ์ค๊ณ๋์์ง๋ง, ํน์ ํ๋ ์์ํฌ์ ํตํฉํ ๋๋ ๋ช ๊ฐ์ง ๊ณ ๋ ค์ฌํญ์ด ์์ต๋๋ค:
React
React๋ ์ปค์คํ
์๋ฆฌ๋จผํธ๋ฅผ ํน๋ณํ๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. forwardRef API๋ฅผ ์ฌ์ฉํ๊ณ ์ ์ ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ๋ณด์ฅํด์ผ ํ ์ ์์ต๋๋ค. react-to-webcomponent์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ React ์ปดํฌ๋ํธ๋ฅผ ์น ์ปดํฌ๋ํธ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋จ์ํํ ์ ์์ต๋๋ค.
Vue.js
Vue.js๋ ์น ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. vue-custom-element์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด Vue ์ปดํฌ๋ํธ๋ฅผ ์ปค์คํ
์๋ฆฌ๋จผํธ๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค. ์น ์ปดํฌ๋ํธ ์์ฑ๊ณผ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ก Vue๋ฅผ ๊ตฌ์ฑํด์ผ ํ ์ ์์ต๋๋ค.
Angular
Angular๋ ์น ์ปดํฌ๋ํธ์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค. CUSTOM_ELEMENTS_SCHEMA๋ฅผ ์ฌ์ฉํ์ฌ Angular๊ฐ ํ
ํ๋ฆฟ์ ์ปค์คํ
์๋ฆฌ๋จผํธ๋ฅผ ์ธ์ํ๋๋ก ํ ์ ์์ต๋๋ค. ๋ํ ์น ์ปดํฌ๋ํธ์ ๋ณ๊ฒฝ ์ฌํญ์ด Angular์ ์ํด ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ์ง๋๋๋ก NgZone์ ์ฌ์ฉํด์ผ ํ ์๋ ์์ต๋๋ค.
๊ฒฐ๋ก
์น ์ปดํฌ๋ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ํจํค์งํ๋ ๊ฒ์ ์ฌ๋ฌ ํ๋ก์ ํธ์ ํ์์ ๊ณต์ ํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ธ์์ ์ค๋ช ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์น ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ์ฑ๋ฅ์ด ์ฐ์ํ๋ฉฐ, ์ ๊ทผ์ฑ์ด ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๋ฅผ npm, CDN ๋๋ ์์ฒด ํธ์คํ ์ ํตํด ๋ฐฐํฌํ๋ , ํจํค์ง ์ ๋ต์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ฑ์ ์ํด ์ต์ ํํ์ธ์. ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์น ์ปดํฌ๋ํธ๋ ํ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค.